﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Forms;
using System.IO;
using cma.cimiss.client;
using cma.cimiss;
using Aspose.Words;
using Aspose.Words.Tables;
using Aspose.Words.Drawing;
using Aspose.Words.Lists;
using Aspose.Words.Fields;


namespace sjzd
{
    
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            

            t1.Text = "";
            
            classCZSJZD CZSJZD1 = new classCZSJZD();
            string[,] YBSZ= CZSJZD1.ZDYBCL(CZSJZD1.readXZYBtxt());
            
            
            string strError="";
            classHQSK hqsk = new classHQSK();
            string strQXSK= hqsk.CIMISSHQQXSK();
            string strXZSK= hqsk.CIMISSHQXZSK(strQXSK, ref strError);//错误内容包括站点实况确实提示
            string[,] szYB = CZSJZD1.CZCL(YBSZ,strQXSK,strXZSK,ref strError);//错误内容包括乡镇与旗县温差大于5℃提示
            t1.Text = strXZSK+strQXSK;
             //errorBox.Text = strError;//后续根据错误字符串是否为0弹框显示
            errorBox.Text =strError;
                
        }
        //将报文转换为数组导出至word产品,待编写完报文处理程序后继续编写此处程序
        public void DCWord(string[,] szYB)
        {
            
            Document doc = new Document(@"D:\发布单模板.doc");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            QXXZConfig windowConfig = new QXXZConfig();
            windowConfig.Show();
        }
    }

    //该类为利用实况与城镇指导预报差值计算乡镇精细化指导预报的方法
    public class classCZSJZD
    {
        string configpathPath = System.Environment.CurrentDirectory + @"\设置文件\路径设置.txt";
        string configXZPath = System.Environment.CurrentDirectory + @"\设置文件\旗县乡镇.txt";
        public string  readXZYBtxt()//该方法读取城镇指导预报,返回指导预报整个内容
        {
            string YBPath="";
            string YBdata = "";
            StreamReader sr = new StreamReader(configpathPath, Encoding.Default);
            String line;
            //读取设置文件的路径配置文件中所有文本，寻找城镇指导预报路径
            while ((line = sr.ReadLine()) != null)
            {
                string[] linShi1 = line.Split('：');
                if (linShi1[0] == "城镇指导预报路径")
                {
                    YBPath = linShi1[1];
                }
            }
            sr.Close();
            YBPath = YBPath + DateTime.Now.ToString("yy") + "."+DateTime.Now.ToString("MM")+"\\06\\"+"呼市气象台指导预报" + DateTime.Now.ToString("MMdd") + ".txt";//文件路径为：基本路径+年后两位.月两位\06\呼市气象台指导预报+两位月两位日.txt
            //判断城镇指导预报是否存在，如果不存在，提示是否手动选择文件
            try
            {               
                sr = new StreamReader(YBPath, Encoding.Default);
                YBdata = sr.ReadToEnd().ToString();          
            }
            catch
            {               
                var result1= System.Windows.MessageBox.Show("路径错误，是否手动选择乡镇指导预报文件","错误",MessageBoxButton.YesNo);
                if(result1==System.Windows.MessageBoxResult.Yes)
                {                  
                    var openFileDialog = new Microsoft.Win32.OpenFileDialog()
                    {
                        Filter = "文本 (*.txt)|*.txt"
                    };
                    var result = openFileDialog.ShowDialog();
                    if (result == true)
                    {
                        YBPath = openFileDialog.FileName;
                        sr = new StreamReader(YBPath, Encoding.Default);
                        YBdata = sr.ReadToEnd().ToString();                       
                    }                  
                }                          
            }


            return YBdata;
        }


        //返回数组每行内容为：旗县区站号+未来七天分别的天气、风向风速、最低气温、最高气温，
        public string[,] ZDYBCL(string YBData)
        {
            StreamReader sr = new StreamReader(configXZPath, Encoding.Default);
            String line;
            //读取设置文件的旗县乡镇文件中第一行，确认旗县镇数
            line = sr.ReadLine();
            sr.Close();
            string[] linShi1 = line.Split(':');
            int intQXGS = Convert.ToInt16(linShi1[1]);
            string[,] zDYBSZ= new string[intQXGS, 7*4+1];//数组行数为旗县个数，每行内容为：旗县名称+未来七天分别的天气、风向风速、最低气温、最高气温，因此列数为1+4*7

            //给每行第一列赋值，为旗县的名称
            int lineCount = 0,i=0;
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (i<intQXGS)
            {
                line = sr.ReadLine();
                if ((2*i+1)==lineCount)
                {
                    zDYBSZ[i++, 0] = line.Split(',')[0];
                }              
                lineCount++;

            }
            sr.Close();
            string[] YBDataLines = YBData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            for (i=0;i<intQXGS;i++)
            {
                int k = 1;
                for(int j=0;j<YBDataLines.Length;j++)
                {
                    linShi1 = YBDataLines[j].Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);                  
                    //linShi1 = System.Text.RegularExpressions.Regex.Split(YBDataLines[j]，);
                    if (zDYBSZ[i,0]==linShi1[0])
                    {
                        zDYBSZ[i, k++] = linShi1[1];
                        zDYBSZ[i, k++] = linShi1[2];
                        zDYBSZ[i, k++] = linShi1[3];
                        zDYBSZ[i, k++] = linShi1[4];
                    }
                }
            }
            lineCount = 0;
            i =0;
            
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (i < intQXGS)
            {
                line = sr.ReadLine();
                if ((2 * i+2) == lineCount)
                {
                    zDYBSZ[i++, 0] = line.Split(',')[0];
                }
                lineCount++;

            }
            sr.Close();

            return zDYBSZ;
        }//YBData为导出的指导预报内容

        public string[,] CZCL(string[,] zdybSZ,string QXSK,string XZSK,ref string strError)//输入为处理后的指导预报数组，旗县实况，各乡镇的实况.//输出数组行数为旗县乡镇个数，每行内容为：旗县名称+区站号+未来七天分别的天气、风向风速、最低气温、最高气温，因此列数为2+4*7
        {
            

            //计算所有旗县与乡镇的个数
            StreamReader sr = new StreamReader(configXZPath, Encoding.Default);
            String line;
            
            line = sr.ReadLine();
            sr.Close();
            string[] linShi1 = line.Split(':');
            int intQXGS = Convert.ToInt16(linShi1[1]);

            string[,] szQXSK = new string[intQXGS, 5];//将旗县实况字符串转换为数组，每列分别为：站点名称、所属旗县、区站号、最高气温、最低气温(还有最后一列降水量，因为此处不用，故列数为6-1)
            int i = 0;
            for(i=0;i<intQXGS;i++)
            {
                for (int j=0;j<5;j++)//注意该处，如果过去24h降水量没有时出现降水量这组为空时，列数就不是6而是5，此时强行赋值会报错
                {
                    szQXSK[i, j] = (QXSK.Split('\n')[i]).Split('\t')[j];
                }
            }
            int XZGS = 0;
            int lineCount = 0;
            i = 0;
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (i < intQXGS)
            {
                line = sr.ReadLine();
                if ((2 * i + 1) == lineCount)
                {
                    XZGS+= line.Split(',').GetLength(0);
                    i++;
                }
                lineCount++;

            }
            sr.Close();

            string[,] szYB = new string[XZGS,30];//数组行数为旗县个数，每行内容为：旗县名称+区站号+未来七天分别的天气、风向风速、最低气温、最高气温，因此列数为2+4*7
            //给数组每行第一列赋值：旗县乡镇名称
            lineCount = 0;
            int intLS = 0;
            i = 0;
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (i < intQXGS)
            {
                line = sr.ReadLine();
                if ((2 * i + 1) == lineCount)
                {
                    for (int j = 0; j < line.Split(',').Length; j++)
                    {
                        szYB[intLS++, 0] = line.Split(',')[j];
                    }
                    i++;
                }
                lineCount++;

            }
            sr.Close();


            sr = new StreamReader(configXZPath, Encoding.Default);
            lineCount = 0;
            i = 0;
            int intHS = 0; intLS = 1;
            while (i < intQXGS)
            {
                line = sr.ReadLine();
                if ((2 * i +2) == lineCount)//寻找乡镇名单中的区站号行
                {
                    string strQXID = line.Split(',')[0];
                    double[] szMax = new double[7], szMin = new double[7];//7天旗县指导最高温度-旗县实况最高温度；7天旗县指导最低温度-旗县实况最低温度；
                    string[] strTQ = new string[7], strFXFS = new string[7];//指导预报7天天气与风向风速
                    int intCount1 = 0, intCount2 = 0, intCount3 = 0, intCount4 = 0;
                    for (int j=1;j<zdybSZ.GetLength(1);j++)//因为指导预报数组和旗县实况已经按照乡镇名单排序，因此不用遍历寻找，只需与乡镇名单用一个序号i即可。遍历每列数据，保存每个时次指导实况差值
                    {
                        if((j-1)%4==0)
                        {
                            strTQ[intCount1++] = zdybSZ[i, j];
                        }
                        else if((j - 2) % 4 == 0)
                        {
                            strFXFS[intCount2++] = zdybSZ[i, j];
                        }
                        else if ((j - 3) % 4 == 0)
                        {
                            szMin[intCount3++] = Math.Round((Convert.ToDouble(zdybSZ[i, j])-Convert.ToDouble(szQXSK[i,4])),1);//旗县实况数组编号为4的列是最低气温
                        }
                        else if ((j - 4) % 4 == 0)
                        {
                            szMax[intCount4++] = Math.Round((Convert.ToDouble(zdybSZ[i, j]) - Convert.ToDouble(szQXSK[i, 3])),1);//旗县实况数组编号为3的列是最高气温
                        }
                    }
                    for(intLS=1;intLS<szYB.GetLength(1);intLS++)
                    {
                        szYB[intHS, intLS] = zdybSZ[i,intLS-1];//从旗县指导预报数组中保存该旗县的预报至整个乡镇精细化预报的数组
                    }
                    int intQXHS = intHS;//保存所属旗县的行数，为了后面做差比较温度差，防止乡镇与旗县温差过大
                    intHS++;
                    for(int j=1;j< line.Split(',').Length; j++)//遍历该旗县每个乡镇
                    {
                        intCount1 = 0; intCount2 = 0; intCount3 = 0; intCount4 = 0;
                        double douMax=0, douMin=0;
                        //寻找该乡镇的最低最高温度
                        for(int k =0;k<XZSK.Split('\n').Length;k++)
                        {
                            if ( XZSK.Split('\n')[k].Contains(line.Split(',')[j]))
                            {
                                douMin = Math.Round(Convert.ToDouble((XZSK.Split('\n')[k]).Split('\t')[4]),1);//按换行符和制表符分割乡镇实况字符串，每行第5个为最低温，第4个为最高温度
                                douMax = Math.Round(Convert.ToDouble((XZSK.Split('\n')[k]).Split('\t')[3]), 1);
                                break;
                            }
                        }
                        for(intLS=1;intLS < szYB.GetLength(1);intLS++)
                        {
                            if(intLS==1)
                            {
                                szYB[intHS, intLS] = line.Split(',')[j];
                            }
                            else if((intLS-2)%4==0)
                            {
                                szYB[intHS, intLS] = strTQ[intCount1++];
                            }
                            else if ((intLS - 3) % 4 == 0)
                            {
                                szYB[intHS, intLS] = strFXFS[intCount2++];
                            }
                            else if ((intLS - 4) % 4 == 0)
                            {
                                if(Math.Abs((douMin + szMin[intCount3])-Convert.ToDouble(szYB[intQXHS,intLS]))>=5)
                                {
                                    strError += szYB[intHS, 0] + '(' + szYB[intHS, 1] + ')' + ((intCount3+1)*24).ToString()+"小时的最低温度与所属旗县的最低温度相差5℃以上，请注意";//如果乡镇与旗县温度绝对值相差5度以上警告
                                }
                                szYB[intHS, intLS] =(douMin+szMin[intCount3++]).ToString("f1");
                            }
                            else if (((intLS - 5) % 4 == 0)&&intLS!=1)
                            {
                                if (Math.Abs((douMax + szMax[intCount4]) - Convert.ToDouble(szYB[intQXHS, intLS])) >= 5)
                                {
                                    strError += szYB[intHS, 0] + '(' + szYB[intHS, 1] + ')' + ((intCount4 + 1) * 24).ToString() + "小时的最低温度与所属旗县的最低温度相差5℃以上，请注意";//如果乡镇与旗县温度绝对值相差5度以上警告
                                }
                                szYB[intHS, intLS] = (douMax + szMax[intCount4++]).ToString("f1");
                            }
                        }
                        intHS++;
                    }
                    i++;
                }
                lineCount++;

            }
            sr.Close();
            /*
            string strYB = "";
            for(intHS=0;intHS<szYB.GetLength(0);intHS++)
            {
                for(intLS=0;intLS<szYB.GetLength(1);intLS++)
                {
                    strYB += szYB[intHS, intLS] + '\t';
                }
                strYB += '\n';
            }
            */
            return szYB;
        }
        public void readXZYBCIMISS()
        {

        }
            
    }

    public class classHQSK
    {
        string configpathPath = System.Environment.CurrentDirectory + @"\设置文件\路径设置.txt";
        string configXZPath = System.Environment.CurrentDirectory + @"\设置文件\旗县乡镇.txt";
        public string  CIMISSHQQXSK()
        {
            /* 1. 定义client对象 */
            DataQueryClient client = new DataQueryClient();

            /* 2.   调用方法的参数定义，并赋值 */
            /*   2.1 用户名&密码 */
            String userId = "BEHT_BFHT_2131";// 
            String pwd = "YZHHGDJM";// 
            /*   2.2 接口ID */
            String interfaceId1 = "getSurfEleByTimeAndStaID";
            /*   2.3 接口参数，多个参数间无顺序 */
            Dictionary<String, String> paramsqx = new Dictionary<String, String>();
            // 必选参数
            paramsqx.Add("dataCode", "SURF_CHN_MUL_HOR"); // 资料代码
            //检索时间段
            string strToday = DateTime.UtcNow.ToString("yyyyMMdd000000");
            //string strYesterday = DateTime.UtcNow.AddDays(-1).ToString("yyyyMMdd000000");
            //string timeRange1 = "(" + strYesterday + "," + strToday + "]";
            paramsqx.Add("times", strToday);

            /*以下程序功能为：根据设置文件夹下的旗县乡镇设置文件获取CIMISS查询需要配置的台站号*/
            StreamReader sr = new StreamReader(configXZPath, Encoding.Default);
            String line;
            //读取设置文件的旗县乡镇文件中第一行，确认旗县镇数
            line = sr.ReadLine();
            sr.Close();
            string[] linShi1 = line.Split(':');
            int intQXGS = Convert.ToInt16(linShi1[1]);
            string QXID="";

            //每两行第一列为旗县ID
            int lineCount = 0;
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (lineCount < intQXGS*2+1)
            {
                line = sr.ReadLine();
                if ((lineCount>1)&&(lineCount%2==0))
                {
                    QXID += line.Split(',')[0]+',';
                }
                lineCount++;

            }
            sr.Close();
            QXID = QXID.Substring(0,QXID.Length-1);

            paramsqx.Add("staIds", QXID);//选择区站号，该处后面调整，从乡镇名单中获取
            paramsqx.Add("elements", "Station_Name,Cnty,Station_Id_C,TEM_Max_24h,TEM_Min_24h,PRE_24h");// 检索要素：站号、站名、最高温度、盟市、旗县
            // 可选参数
            //paramsqx.Add("orderby", "Station_ID_C:ASC"); // 排序：按照站号从小到大，最高温降序
            /*   2.4 返回文件的格式 */
            String dataFormat = "tabText";
            StringBuilder QXSK = new StringBuilder();//返回字符串
            // 初始化接口服务连接资源
            client.initResources();
            // 调用接口
            int rst = client.callAPI_to_serializedStr(userId, pwd, interfaceId1, paramsqx, dataFormat, QXSK);            
            // 释放接口服务连接资源
            client.destroyResources();
            string strData = Convert.ToString(QXSK);
            string[] SZlinshi = strData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            strData = "";
            /*删掉CIMISS返回数据第一行的返回信息以及第二行的列标题，只保留数据*/
            for (int i = 0; i < SZlinshi.Length; i++)
            {
                if (i > 1)
                {
                    strData += SZlinshi[i] + '\n';
                }
            }
            strData = strData.Substring(0, strData.Length - 1);
            //对旗县实况排序，使得旗县的顺序与旗县名单文件中的一致，便于程序后续处理
            lineCount = 0;
            string strLS=strData;
            strData = "";
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (lineCount < intQXGS * 2 + 1)
            {
                line = sr.ReadLine();
                if ((lineCount > 1) && (lineCount % 2 == 0))
                {
                    QXID = line.Split(',')[0];
                    SZlinshi = strLS.Split('\n');
                    for(int j =0;j<SZlinshi.Length;j++)
                    {
                        if(SZlinshi[j].Contains(QXID))//判断该行是否存在该旗县区站号，如果包含，就把整行数据保存
                        {
                            strData += SZlinshi[j] + '\n';
                        }
                    }
                }
                lineCount++;

            }
            sr.Close();
            strData = strData.Substring(0, strData.Length - 1);
            return strData;

        }

        public string CIMISSHQXZSK(string strQXData, ref string strError)//函数输入为旗县CIMISS实况数据，为了当乡镇实况数据缺失时候用旗县数据暂时替换处理；输出为错误提示，提醒缺少的站点；返回为各乡镇的实况，包括数据缺失站点的临时替换数据；
        {
            string strData = "";
            
            /* 1. 定义client对象 */
            DataQueryClient client = new DataQueryClient();

            /* 2.   调用方法的参数定义，并赋值 */
            /*   2.1 用户名&密码 */
            String userId = "BEHT_BFHT_2131";// 
            String pwd = "YZHHGDJM";// 
            /*   2.2 接口ID */
            String interfaceId1 = "statSurfEleByStaID";
            /*   2.3 接口参数，多个参数间无顺序 */
            Dictionary<String, String> paramsqx = new Dictionary<String, String>();
            // 必选参数
            paramsqx.Add("dataCode", "SURF_CHN_MUL_HOR"); // 资料代码
            //检索时间段
            string strToday = DateTime.UtcNow.ToString("yyyyMMdd000000");
            string strYesterday = DateTime.UtcNow.AddDays(-1).ToString("yyyyMMdd000000");
            string timeRange1 = "(" + strYesterday + "," + strToday + "]";
            paramsqx.Add("timeRange", timeRange1);

            /*以下程序功能为：根据设置文件夹下的旗县乡镇设置文件获取CIMISS查询需要配置的台站号*/
            StreamReader sr = new StreamReader(configXZPath, Encoding.Default);
            String line;
            //读取设置文件的旗县乡镇文件中第一行，确认旗县镇数
            line = sr.ReadLine();
            sr.Close();
            string[] linShi1 = line.Split(':');
            int intQXGS = Convert.ToInt16(linShi1[1]);
            string XZID = "";
            //每两行第一列为旗县ID 
            int lineCount = 0;
            sr = new StreamReader(configXZPath, Encoding.Default);
            while (lineCount < intQXGS * 2 + 1)
            {
                line = sr.ReadLine();
                if ((lineCount > 1) && (lineCount % 2 == 0))//避免取到第一行的旗县个数，因此lineCount>1，站号为编号偶数行故对2取余
                {
                    for(int i =1;i< line.Split(',').Length;i++)//提取乡镇区站号，编号为0是旗县站号，故从1开始
                    {
                        XZID += line.Split(',')[i] + ',';
                    }
                    
                }
                lineCount++;

            }
            sr.Close();
            XZID = XZID.Substring(0, XZID.Length - 1);

            paramsqx.Add("staIds", XZID);//选择区站号，从乡镇名单中获取
            paramsqx.Add("elements", "Station_Name,Cnty,Station_Id_C");// 检索要素：站号、旗县、区站号
            paramsqx.Add("statEles", "MAX_TEM_Max,MIN_TEM_MIN,SUM_PRE_1h");// 统计要素最高温度的最大值，与最低温度的最小值以及小时降水量
            // 可选参数
            paramsqx.Add("orderby", "Station_ID_C:ASC"); // 排序：按照站号从小到大
            /*   2.4 返回文件的格式 */
            String dataFormat = "tabText";
            StringBuilder retStrXZ = new StringBuilder();//返回字符串
            // 初始化接口服务连接资源
            client.initResources();
            // 调用接口
            int rst = client.callAPI_to_serializedStr(userId, pwd, interfaceId1, paramsqx, dataFormat, retStrXZ);
            // 释放接口服务连接资源
            client.destroyResources();
            strData= Convert.ToString(retStrXZ);

            string[] SZlinshi = strData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            strData = "";
            /*删掉CIMISS返回数据第一行的返回信息以及第二行的列标题，只保留数据*/
            for(int i =0;i<SZlinshi.Length;i++)
            {
                if(i>1)
                {
                    strData += SZlinshi[i]+'\n';
                }
            }
            strData = strData.Substring(0, strData.Length - 1);
            /*以下程序检查导出的实况数据的站点是否完整*/
            sr = new StreamReader(configXZPath, Encoding.Default);
            lineCount = 0;
            while (lineCount < intQXGS * 2 + 1)
            {
                line = sr.ReadLine();
                if ((lineCount > 1) && (lineCount % 2 == 0))
                {
                    for (int i = 1; i < line.Split(',').Length; i++)
                    {
                        if(!strData.Contains(line.Split(',')[i]))//如果导出的实况数据中没有区站号为line.Split(',')[i]的站点
                        {
                            StreamReader sr1 = new StreamReader(configXZPath, Encoding.Default);//新建一个流，重新遍历乡镇名单文件，找到该乡镇对应的旗县
                            string strLS = sr1.ReadToEnd();//整个乡镇名单文本
                            string[] szLS=strLS.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);//名单按行分组
                            strLS = szLS[lineCount - 1];//区站号前一行为站名，因此Linecount-1确认站名，列数与区站号一致，
                            szLS = strLS.Split(',');//该旗县及其乡镇的名称数组
                            strError += szLS[i]+ "(" +line.Split(',')[i]+")的实况数据不存在，实况暂时用其旗县站点"+line.Split(',')[0]+"的实况代替，请及时确认站点信息，设置旗县站点";
                            string[] szQXData = strQXData.Split('\n');
                            for(int j = 2;j<szQXData.Length;j++)//确认站名后用乡镇的站名代替第一组，后面的内容用其所在旗县的实况代替
                            {
                                if(szQXData[j].Contains(line.Split(',')[0]))
                                {
                                    string[] szLS2 = szQXData[j].Split('\t');//保存对应旗县的实况数组
                                    for(int l=0;l<szLS2.Length;l++)
                                    {
                                        if (l == 0)
                                            strData += '\n'+szLS[i];
                                        else
                                            strData += '\t' + szLS2[l];

                                    }

                                    
                                    break;
                                }
                            }
                            sr1.Close();
                        }
                    }

                }
                lineCount++;

            }
            sr.Close();

            return strData;

        }


    }
}
